¿Qué es un borde?

  • Un borde es una transición abrupta de intensidad en la imagen.
  • Generalmente corresponde a límites de objetos.
  • Detectar bordes es un paso clave en segmentación y reconocimiento.

Gradientes

  • Los bordes se relacionan con el gradiente de la imagen:
    \[\nabla I = \left( \frac{\partial I}{\partial x}, \frac{\partial I}{\partial y} \right)\]
  • Magnitud del gradiente:
    \[|\nabla I| = \sqrt{\left(\frac{\partial I}{\partial x}\right)^2 + \left(\frac{\partial I}{\partial y}\right)^2}\]

Operadores de Gradiente

Los gradientes se aproximan con operadores de convolución:

  • Roberts \[ R_x = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}, \quad R_y = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} \]

  • Prewitt \[ P_x = \begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{bmatrix}, \quad P_y = \begin{bmatrix} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{bmatrix} \]

  • Sobel (más usado) \[ S_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix}, \quad S_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} \]

Método Sobel

  • Usa máscaras convolucionales para aproximar derivadas.
  • Filtrando con \(S_x, S_y\) se obtienen los bordes en X e Y.
  • Luego se calcula la magnitud del gradiente.

Método Canny

  1. Suavizado con filtro gaussiano.
  2. Cálculo de gradientes.
  3. No-maximum suppression (adelgaza bordes).
  4. Hysteresis thresholding (clasifica píxeles como borde fuerte, débil o no borde).

Comparación visual

  • Roberts y Prewitt: simples, pero sensibles al ruido.
  • Sobel: rápido y más robusto.
  • Canny: más elaborado, produce bordes finos y continuos.

Ejemplo en Python (OpenCV)

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("imagen.png", 0)

edges_roberts = cv2.filter2D(img, -1, np.array([[1,0],[0,-1]]))
edges_prewittx = cv2.filter2D(img, -1, np.array([[-1,0,1],[-1,0,1],[-1,0,1]]))
edges_sobel = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
edges_canny = cv2.Canny(img, 100, 200)

plt.figure(figsize=(10,8))
plt.subplot(2,2,1); plt.imshow(edges_roberts, cmap="gray"); plt.title("Roberts")
plt.subplot(2,2,2); plt.imshow(edges_prewittx, cmap="gray"); plt.title("Prewitt X")
plt.subplot(2,2,3); plt.imshow(edges_sobel, cmap="gray"); plt.title("Sobel")
plt.subplot(2,2,4); plt.imshow(edges_canny, cmap="gray"); plt.title("Canny")
plt.show()

Aplicaciones

  • Segmentación de objetos.
  • Reconocimiento de formas.
  • Análisis de movimiento.
  • Visión en medicina, industria y satélites.